package linkwechat.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Component
public class OssTempate {
    //  bucket，j3-communication
    private final String bucket = "zgashopp";
    // 你的 bucket 外网访问域名，https://oss-cn-guangzhou.aliyuncs.com
    private final String endpoint = "oss-cn-beijing.aliyuncs.com";
    // 拼接返回url要用的，bucket + 域名 例如:j3-communication.oss-cn-guangzhou.aliyuncs.com
    private final String bucketHost =bucket+"."+endpoint;
    // AccessKey id
    private final String accessKeyId = "LTAI5t7ejrswBJUVUPS1cXLv";
   //AccessKey secret
    private final String accessKeySecret = "mjmmIsq8KA4LoLbaBSVBcqtyLoTQ7d";

    /**
     * 单个文件上传
     * MultipartFile:spring框架处理表单上传文件的类
     */
    public String upload(MultipartFile file)  {
        // 文件名称生成（将随机组成的16位比特数转为string类型 ，并且将随机数中的- 替换为空）
        String uuid = UUID.randomUUID().toString().replace("-", "");
        //拼接一个路径:  随机组成数 + 当前文件的完整名称
        String path =uuid+"/"+ file.getOriginalFilename();
        try {
            // 调用ossUpload
            //file.getInputStream():将文件转换成输入流的形式来传输文件，会抛出IOException异常。
            ossUpload(bucket, path, file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 因为 oss 不会返回访问 url 所以我们自己可以拼接一个：
        // 协议（https://） + 域名访问地址（zhangguangao.oss-cn-guangzhou.aliyuncs.com） + 自己拼接的路径（xxx/xxx/a.jpg）
        return "https://" + bucketHost + "/" + path;
    }

    /**
     * 多个文件上传
     */
    public List<String> upload(MultipartFile[] files) {
        List<String> usrList = new ArrayList<>(files.length);
        for (MultipartFile file : files) {
            usrList.add(upload(file));
        }
        return usrList;
    }

    /**
     * 具体上传代码
     * @param bucket backet名称
     * @param path 路径
     * @param inputStream 文件流
     */
   private PutObjectResult ossUpload(String bucket ,String path ,InputStream inputStream){
       OSS oss = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
       PutObjectResult putObjectResult = oss.putObject(bucket, path, inputStream);
       return putObjectResult;
   }

}